package cn.geekyspace.scanhive.infrastructure.ui;

import cn.geekyspace.scanhive.domain.entity.CleaningData;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.Label;
import javafx.scene.control.TableView;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * UI扫码记录表格组件
 */
@Data
@Slf4j
@Component
@RequiredArgsConstructor
public class UIScanTable {

    private Label scanCount;                     // 扫码计数
    private TableView<CleaningData> scanTable;   // 扫码记录表格

    // 注入UI组件
    private final UILogger uiLogger;
    private final ObservableList<CleaningData> scanRecordList = FXCollections.observableArrayList();
    private int idCounter = 0;                   // 自动ID计数器
    private CleaningData pendingData;            // 待处理数据（等PLC回传）

    /** 初始化扫码记录表格并绑定数据源 */
    public void initScanRecordTable(TableView<CleaningData> table) {
        this.scanTable = table;
        table.setItems(scanRecordList);                                         // 绑定数据源
        scanTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);   // 设置列宽自适应
    }

    /** 添加扫码记录 */
    public void addScanRecord(CleaningData data) {
        // 先拷贝数据，避免id不匹配的更新
        pendingData = data.copy();
        data.setId(++idCounter);             // 自动分配ID
        scanRecordList.add(0, data);   // 插入到列表顶部
        // 更新扫码计数
        Platform.runLater(() -> scanCount.setText(String.valueOf(idCounter)));
    }

    /** 合并PLC数据 */
    public void mergePlcData(CleaningData plcData) {
        if (plcData == null || scanRecordList.isEmpty()) return;
        // 合并数据
        CleaningData latestRecord = scanRecordList.get(0);
        latestRecord.mergePlcData(plcData);
        scanRecordList.set(0, latestRecord);   // 强制刷新 TableView
        pendingData = null;                    // 清除待处理数据
    }

    /** 是否存在待处理数据 */
    public Boolean hasPendingData() {
        return pendingData != null;
    }

    /** 清空扫码记录 */
    public void clearScanRecords() {
        // 重置 ID 计数器
        idCounter = 0;
        Platform.runLater(() -> scanCount.setText(String.valueOf(idCounter)));
        // 清空列表
        pendingData = null;
        scanRecordList.clear();
        uiLogger.success("重置成功");
    }

}
